#include "MenuUsuariosConectados.h"

#include <sstream>

MenuUsuariosConectados::MenuUsuariosConectados() {
	crearMenu();
}

MenuUsuariosConectados::~MenuUsuariosConectados() {
	borrarMenu();
}

void MenuUsuariosConectados::crearMenu() {
	UsersMapType usuarios = Entorno::getInstance()->obtenerUsuarios();

	UsersMapType::iterator it = usuarios.begin();
	int i= 1;
	for (; it != usuarios.end(); it++) {
		int id = (*it).first;
		if (id != Usuario::getInstance()->getId()) {
			ConsultarArchivosDeUsuarioCommand* command = new ConsultarArchivosDeUsuarioCommand(id,(*it).second);
			commands[i] = command;
			MenuItem* item = new MenuItem(i,(*it).second,command);
			opciones[i] = item;
			add(*item);
			i++;
		}
	}

	VolverAlMenuAnteriorCommand* volverCommand = new VolverAlMenuAnteriorCommand();
	commands[i] = volverCommand;
	MenuItem* itemVolver = new MenuItem(i,"Volver",volverCommand);
	opciones[i] = itemVolver;

	add(*itemVolver);
}

void MenuUsuariosConectados::borrarMenu() {
	clearItems();
	CommandsMap::iterator endCommands = commands.end();
	for (CommandsMap::iterator it = commands.begin(); it != endCommands; ++it) {
		delete commands[(*it).first];
	}
	commands.clear();

	MenuItemsMap::iterator endMenuItems = opciones.end();
	for (MenuItemsMap::iterator it = opciones.begin(); it != endMenuItems; ++it) {
		delete opciones[(*it).first];
	}
	opciones.clear();
}

void MenuUsuariosConectados::update() {
	borrarMenu();
	crearMenu();

	cout << "Usuarios Conectados:" << endl << endl;
	display();
	cout << endl << "Opción: ";

	string input;
	int opcion;
	cin.clear();
	getline(cin, input);
	stringstream myStream(input);
	if (myStream >> opcion) {
		select(opcion);
	}
}
